동적 프로그래밍
최근 수정 시각:
1. 개요[편집]
미국의 응용수학자 리처드 E. 벨만이 제시한 최적화 이론의 한 갈래. 현대에는 그 의미가 확장되어 문제 풀이 기법 혹은 최적화 기법으로 인식된다.
2. 상세[편집]
Divide & Conquer, Overlapping Subproblem
2.1. 최적제어에서의 동적 프로그래밍[편집]
기본적으로 동적 프로그래밍은 최적 제어 문제를 해결하기 위해서 고안된 방법이다.
2.2. 컴퓨터 과학에서의 동적 프로그래밍[편집]
상태기반의 문제를 재귀적으로 해석하는 방법은 너무나도 일반화 하기 쉬운 강력한 방법이었다. 이 문제를 최적제어 문제에만 쓰기 아까웠던 벨만은 다른 문제에도 사용하기 시작하였고 최적 경로, 그래프 탐색 문제등을 시작으로 동적 프로그래밍의 사상 아래에서 해결될 수 있음을 보였다.
이와 관련된 대표적인 예제는 동적 프로그래밍의 방법을 적용하여 피보나치 수열을 최적화 하는 문제가 있다. 아래의 코드는 Dictionary<int, int[]> 형태의 자료구조에 계산 값을 저장한 뒤, 중복된 계산식이 호출되면 해당 자료구조에서 이전에 계산된 값을 확인 후, 계산 값을 반환하여 불필요한 계산삽질을 처리하지 않게 한다.
이와 관련된 대표적인 예제는 동적 프로그래밍의 방법을 적용하여 피보나치 수열을 최적화 하는 문제가 있다. 아래의 코드는 Dictionary<int, int[]> 형태의 자료구조에 계산 값을 저장한 뒤, 중복된 계산식이 호출되면 해당 자료구조에서 이전에 계산된 값을 확인 후, 계산 값을 반환하여 불필요한 계산
Dictionary<int, int[]> dicFibo = new Dictionary<int, int[]>();
public int[] Getfibonacci(int n)
{
if (n == 0)
{
if (!dicFibo.ContainsKey(0))
dicFibo.Add(0, new int[] { 1, 0 });
return new int[] { 1, 0 };
}
else if (n == 1)
{
if (!dicFibo.ContainsKey(1))
dicFibo.Add(1, new int[] { 0, 1 });
return new int[] { 0, 1 };
}
else
{
if (dicFibo.ContainsKey(n))
{
return dicFibo[n];
}
else
{
dicFibo[n] = new int[] { Getfibonacci(n - 1)[0] + Getfibonacci(n - 2)[0] , Getfibonacci(n - 1)[1] + Getfibonacci(n - 2)[1] };
return dicFibo[n];
}
}
}
3. 여담[편집]
그의 자서전에 따르면 공군놈들이 연구 이름을 '의사 결정 프로세스'라고 재미없게 지으니까 좆같이 굴길래 '다이나믹 프로그래밍' 이라는 간지나는 이름을 붙였더니 좋아했다고 한다.[1]
보통은 코딩 새싹반 C나 C++을 배울때 피보나치 수열을 최적화하면서 처음 접하게 된다.
재귀함수나 반복문으로 구현한다.
보통은 코딩 새싹반 C나 C++을 배울때 피보나치 수열을 최적화하면서 처음 접하게 된다.
재귀함수나 반복문으로 구현한다.
[1] 그의 자서전 '태풍의 눈'에서 확인이 가능하다.
Contents are available under the CC BY-NC-SA 2.0 KR; There could be exceptions if specified or metioned.
개인정보 처리방침
개인정보 처리방침